Libraries:

library(tidyverse)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 3.2.1     v purrr   0.3.3
v tibble  2.1.3     v dplyr   0.8.3
v tidyr   1.0.0     v stringr 1.4.0
v readr   1.3.1     v forcats 0.4.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(readr)
library(rvest)
Loading required package: xml2

Attaching package: 㤼㸱rvest㤼㸲

The following object is masked from 㤼㸱package:purrr㤼㸲:

    pluck

The following object is masked from 㤼㸱package:readr㤼㸲:

    guess_encoding
library(stats)
library(readxl)
library(dplyr)
library(stringr)
library(ggplot2)
library(ggthemes)
package 㤼㸱ggthemes㤼㸲 was built under R version 3.6.2
library(stringr)
library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.12.6 using 4 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: 㤼㸱data.table㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    between, first, last

The following object is masked from 㤼㸱package:purrr㤼㸲:

    transpose
library(geojsonio)

Attaching package: 㤼㸱geojsonio㤼㸲

The following object is masked from 㤼㸱package:base㤼㸲:

    pretty
library(leaflet)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(rgdal)
Loading required package: sp
rgdal: version: 1.4-7, (SVN revision 845)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
 Path to GDAL shared files: C:/Users/neris/OneDrive/Documents/R/win-library/3.6/rgdal/gdal
 GDAL binary built with GEOS: TRUE 
 Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
 Path to PROJ.4 shared files: C:/Users/neris/OneDrive/Documents/R/win-library/3.6/rgdal/proj
 Linking to sp version: 1.3-1 
library(haven)
library(stargazer)

Please cite as: 

 Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
 R package version 5.2.2. https://CRAN.R-project.org/package=stargazer 

Data:

Model 3:

First making a graph of annual GDP highs and lows – maybe a temporary proxy for recessions?

Annual enrollment graph:

Join enrollment data and gdp data to create linear model test:

Graph it?

College Proximity Question 5/3: (Reading in Ivy’s data)

cz <- read_dta('cz.dta')
Error in read_dta("cz.dta") : could not find function "read_dta"

Read in/create mobility data: (Trends in Mobility: Commuting Zone Intergenerational Mobility Estimates by Birth Cohort) https://opportunityinsights.org/data/?geographic_level=101&topic=0&paper_id=0#resource-listing

Read in geojson file:

Commuting zones on the map () are in 1990s format. They need to be converted so our post-2000 data can be connected to the shapefiles: (https://www.ers.usda.gov/data-products/commuting-zones-and-labor-market-areas/)

Making the map actually display data:

cz.geo %>%
  leaflet() %>%
  addTiles() %>%
  addPolygons(fillColor = ~colors1(cz.geo@data$ncollege),
              weight = 1,
              color = "white",
              opacity = 0.5,
              fillOpacity = .7) %>%
  setView(-96, 37.8, 3) %>%
  addLegend(pal = colors1,
            values = cz.geo@data$ncollege,
            title = "Number of Colleges in Commuting Zone")
Some values were outside the color scale and will be treated as NA

Try to run some lms:

Ivy’s STATA code:

foreach x of varlist ncollege nfouryr nfouryrpriv npub nelite hascollege{
    
foreach y of varlist kfr_pooled_pooled_p1 kfr_pooled_pooled_p25 kfr_pooled_pooled_p50 kfr_pooled_pooled_p75 kfr_pooled_pooled_p100 {
    reg `y' `x' popdensity2010 med_hhinc2016, r 
    outreg2 using `x'_kfr, excel append ctitle(`y')
}

Variables of interest:

as.formula(paste0(yvar1, " ~ ", paste0(xvars1, collapse =  " + ")))
kfr_pooled_pooled_p1 ~ ncollege + nfouryr + nfouryrpriv + npub + 
    nelite + hascollege + popdensity2010 + med_hhinc2016

testing?

stargazer(lm.kfr_p1,
          type = "text",
          dep.var.labels = c("kfr_pooled_pooled_p1"))
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

===============================================
                        Dependent variable:    
                    ---------------------------
                                kfr            
-----------------------------------------------
ncollege                       0.003           
                              (0.004)          
                                               
nfouryr                       0.007*           
                              (0.004)          
                                               
nfouryrpriv                  -0.012***         
                              (0.004)          
                                               
npub                         -0.011***         
                              (0.004)          
                                               
nelite                         0.006           
                              (0.005)          
                                               
hascollege                   -0.049***         
                              (0.006)          
                                               
popdensity2010              -0.0001***         
                             (0.00001)         
                                               
med_hhinc2016               0.00000***         
                             (0.00000)         
                                               
Constant                     0.251***          
                              (0.012)          
                                               
-----------------------------------------------
Observations                    741            
R2                             0.281           
Adjusted R2                    0.273           
Residual Std. Error      0.062 (df = 732)      
F Statistic           35.756*** (df = 8; 732)  
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01

nelite on kfr at different levels

htmtable.nelite <- stargazer(nelite.p1, nelite.p25, nelite.p50, nelite.p75, nelite.p100,
          type = "html",
          dep.var.labels = c("Bottom 1%", "25%", "50%", "75%", "Top 1%"),
          out = "nelitetable.html")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5"><em>Dependent variable:</em></td></tr>
<tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
<tr><td style="text-align:left"></td><td>Bottom 1%</td><td>25%</td><td>50%</td><td>75%</td><td>Top 1%</td></tr>
<tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">nelite</td><td>-0.004</td><td>-0.002</td><td>-0.001</td><td>0.001</td><td>0.004</td></tr>
<tr><td style="text-align:left"></td><td>(0.003)</td><td>(0.003)</td><td>(0.002)</td><td>(0.002)</td><td>(0.003)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">popdensity2010</td><td>-0.0001<sup>***</sup></td><td>-0.0001<sup>***</sup></td><td>-0.00004<sup>***</sup></td><td>-0.00002<sup>***</sup></td><td>-0.00000</td></tr>
<tr><td style="text-align:left"></td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">med_hhinc2016</td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000</td><td>-0.00000<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">Constant</td><td>0.221<sup>***</sup></td><td>0.350<sup>***</sup></td><td>0.471<sup>***</sup></td><td>0.585<sup>***</sup></td><td>0.770<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.012)</td><td>(0.010)</td><td>(0.009)</td><td>(0.009)</td><td>(0.009)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>741</td><td>741</td><td>741</td><td>741</td><td>741</td></tr>
<tr><td style="text-align:left">R<sup>2</sup></td><td>0.141</td><td>0.104</td><td>0.055</td><td>0.016</td><td>0.030</td></tr>
<tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>0.137</td><td>0.100</td><td>0.051</td><td>0.012</td><td>0.026</td></tr>
<tr><td style="text-align:left">Residual Std. Error (df = 737)</td><td>0.068</td><td>0.057</td><td>0.050</td><td>0.047</td><td>0.053</td></tr>
<tr><td style="text-align:left">F Statistic (df = 3; 737)</td><td>40.261<sup>***</sup></td><td>28.387<sup>***</sup></td><td>14.380<sup>***</sup></td><td>4.096<sup>***</sup></td><td>7.651<sup>***</sup></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
</table>

image print cheeeeck:

tables %>%
  ggplot() +
  geom_bar(stat = "identity") +
  geom_image(aes(image = picture),
             size = .2)
Error: geom_bar requires the following missing aesthetics: x, y

Plotting the lms:

Wait lemme try the long format thing:

summary(long.lm1)

Call:
lm(formula = kfr ~ ncollege + black + white + popdensity2010 + 
    med_hhinc2016, data = long.data1a)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.39907 -0.10535 -0.01125  0.09114  0.85377 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     4.778e-01  7.112e-03  67.186  < 2e-16 ***
ncollege       -1.006e-03  3.136e-04  -3.208  0.00134 ** 
blackTRUE      -9.917e-02  3.547e-03 -27.960  < 2e-16 ***
whiteTRUE       2.312e-02  3.299e-03   7.006 2.61e-12 ***
popdensity2010 -1.496e-05  7.061e-06  -2.118  0.03419 *  
med_hhinc2016   9.847e-07  1.429e-07   6.893 5.80e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.142 on 10244 degrees of freedom
  (865 observations deleted due to missingness)
Multiple R-squared:  0.1191,    Adjusted R-squared:  0.1187 
F-statistic:   277 on 5 and 10244 DF,  p-value: < 2.2e-16

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogImVjb240MDEgZmluYWwgcHJvamVjdCBSIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KTGlicmFyaWVzOg0KYGBge3IgbGlicmFyaWVzLCByZXN1bHRzID0gIm1hcmt1cCJ9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdlb2pzb25pbykNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkocmdkYWwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpgYGANCg0KRGF0YToNCmBgYHtyIGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0NCiMgR0RQIHVwIHRvIEZlYiAyMDIwDQojIGh0dHBzOi8vaWhzbWFya2l0LmNvbS9wcm9kdWN0cy91cy1tb250aGx5LWdkcC1pbmRleC5odG1sDQpnZHAuaW5kZXguZGF0YSA8LSByZWFkeGw6OnJlYWRfeGxzeCgnVVMtTW9udGhseS1HRFAtSGlzdG9yeS1EYXRhLnhsc3gnLCBzaGVldCA9IDMpDQpnZHAuaW5kZXggPC0gZ2RwLmluZGV4LmRhdGENCmNvbG5hbWVzKGdkcC5pbmRleClbMV0gPC0gIllfTSINCnllYXIubW9udGggPC0gc3RyX3NwbGl0X2ZpeGVkKGdkcC5pbmRleCRZX00sICcgLSAnLCAyKQ0KY29sbmFtZXMoeWVhci5tb250aCkgPC0gYygnWWVhcicsICdNb250aCcpDQpnZHAuaW5kZXggPC0gY2JpbmQoeWVhci5tb250aCwgZ2RwLmluZGV4WywgLTFdKQ0KZ2RwLmFubnVhbCA8LSBnZHAuaW5kZXggJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBzdW1tYXJpemUoTWF4R0RQID0gbWF4KGBNb250aGx5IFJlYWwgR0RQIEluZGV4YCksDQogICAgICAgICAgICBNaW5HRFAgPSBtaW4oYE1vbnRobHkgUmVhbCBHRFAgSW5kZXhgKSkNCg0KIyBodHRwczovL25jZXMuZWQuZ292L3Byb2dyYW1zL2RpZ2VzdC9kMTgvdGFibGVzL2R0MThfMzA2LjEwLmFzcA0KZW5yb2xsbWVudC5kYXRhIDwtIHJlYWRfeGxzKCd0YWJuMzA2LjEwLnhscycpDQplbnJvbGxtZW50IDwtIGVucm9sbG1lbnQuZGF0YVsxOjEyXQ0KIyBlbnJvbGxtZW50IGlzIGluIHRob3VzYW5kcw0KZW5yb2xsbWVudCA8LSBlbnJvbGxtZW50Wy1jKDEsIDMsIDE1LCAyNywgMzksIDUxLCA2MywgNzUsIDk5LCAxMTEsIDEyMywgMTM1OjEzOSksIF0NCmNvbDEgPC0gZGF0YS5mcmFtZShzdHJfcmVtb3ZlX2FsbChlbnJvbGxtZW50W1sxXV0sICdcXC4nKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KY29sMVsyLCAxXSA8LSAiQWxsX1N0dWRlbnRzIg0KZW5yb2xsbWVudCA8LSBjYmluZChjb2wxLCBlbnJvbGxtZW50WywgLTFdKQ0KZW5yb2xsbWVudCA8LSB0KGVucm9sbG1lbnQpDQpyb3duYW1lcyhlbnJvbGxtZW50KSA8LSBjKCkNCmNvbG5hbWVzKGVucm9sbG1lbnQpIDwtIGVucm9sbG1lbnRbMSwgXQ0KZW5yb2xsbWVudCA8LSBkYXRhLmZyYW1lKGVucm9sbG1lbnQpDQpjb2xuYW1lcyhlbnJvbGxtZW50KVsxXSA8LSAnWWVhcicNCmVucm9sbG1lbnQgPC0gZW5yb2xsbWVudFstMSwgXQ0KWWVhcnMgPC0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdChlbnJvbGxtZW50JFllYXIsICJbOmRpZ2l0Ol17NH0iKSkNCmVucm9sbG1lbnQgPC0gY2JpbmQoWWVhcnMsIGVucm9sbG1lbnRbLCAtMV0pDQplbnJvbGxtZW50IDwtIGRhdGEuZnJhbWUobGFwcGx5KGVucm9sbG1lbnQsIGZ1bmN0aW9uKHgpeyANCiAgZ3N1YigiLS0tIiwgTkEsIHgpDQp9KSkNCnN0cihlbnJvbGxtZW50KQ0KDQplbnJvbGxtZW50MSA8LSBlbnJvbGxtZW50WywgMToyXQ0KZ2RwLmFubnVhbDEgPC0gZ2RwLmFubnVhbA0KYWxsLnN0dWRlbnRzIDwtIGFzLm51bWVyaWMoZW5yb2xsbWVudFs0OjExLCAyXSkNCg0KZ2RwLmFubnVhbCRZZWFyIDwtIGFzLmZhY3RvcihnZHAuYW5udWFsJFllYXIpDQplbnJvbGxtZW50MSRZZWFycyA8LSBhcy5mYWN0b3IoZW5yb2xsbWVudDEkWWVhcnMpDQplbnJvbGxtZW50MSRBbGxfU3R1ZGVudHMgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZW5yb2xsbWVudDEkQWxsX1N0dWRlbnRzKSkNCmBgYA0KDQpNb2RlbCAzOg0KDQogIEZpcnN0IG1ha2luZyBhIGdyYXBoIG9mIGFubnVhbCBHRFAgaGlnaHMgYW5kIGxvd3MgLS0gbWF5YmUgYSB0ZW1wb3JhcnkgcHJveHkgZm9yIHJlY2Vzc2lvbnM/DQpgYGB7ciBncmFwaDEsIGluY2x1ZGUgPSBGQUxTRX0NCmdkcC5hbm51YWwgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNaW5HRFAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdSZWFsIEdEUCcpDQpgYGANCg0KICBBbm51YWwgZW5yb2xsbWVudCBncmFwaDoNCmBgYHtyIGdyYXBoMiwgaW5jbHVkZSA9IEZBTFNFfQ0KZW5yb2xsbWVudDEgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IDEpKSArDQogIHRoZW1lX2Vjb25vbWlzdCgpICsNCiAgeWxhYignRW5yb2xsbWVudCcpDQpgYGANCg0KICBKb2luIGVucm9sbG1lbnQgZGF0YSBhbmQgZ2RwIGRhdGEgdG8gY3JlYXRlIGxpbmVhciBtb2RlbCB0ZXN0Og0KYGBge3IgbG0xLCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0IDwtIGlubmVyX2pvaW4oZW5yb2xsbWVudDEsIGdkcC5hbm51YWwxLA0KICAgICAgICAgIGJ5ID0gYygiWWVhcnMiID0gIlllYXIiKSkNCg0KbG0xIDwtIGxtKEFsbF9TdHVkZW50cyB+IE1heEdEUCwNCiAgICAgICAgICBkYXRhID0gdGVzdCwNCiAgICAgICAgICBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0Kc3VtbWFyeShsbTEpDQpgYGANCg0KICBHcmFwaCBpdD8NCmBgYHtyIGdyYXBoM180LCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0ICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdFbnJvbGxtZW50IGJ5IEFsbCBTdHVkZW50cycpDQoNCnRlc3QgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gWWVhcnMsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgIyBnZW9tX2FibGluZShzbG9wZSA9IDAuODAxNSwgaW50ZXJjZXB0ID0gNjMxNi43MjA3KSArDQogIHRoZW1lX2Vjb25vbWlzdCgpDQpgYGANCg0KQ29sbGVnZSBQcm94aW1pdHkgUXVlc3Rpb24gNS8zOg0KKFJlYWRpbmcgaW4gSXZ5J3MgZGF0YSkNCmBgYHtyIHJlYWQgcHJveGltaXR5IGRhdGEsIHJlc3VsdHMgPSAibWFya3VwIn0NCiMgY3pfY29sbGVnZSA8LSByZWFkX2R0YSgiY3pfY29sbGVnZS5kdGEiKQ0KY3ogPC0gcmVhZF9kdGEoJ2N6LmR0YScpDQojIGNvbGxlZ2VzIDwtIHJlYWRfZHRhKCdjb2xsZWdlcy5kdGEnKQ0KIyBtb2JpbGl0eS5yZXN1bHRzIDwtIHJlYWRfeGxzeCgnbW9iaWxpdHlfcmVzdWx0cy54bHN4JykNCmBgYA0KDQpSZWFkIGluL2NyZWF0ZSBtb2JpbGl0eSBkYXRhOg0KKFRyZW5kcyBpbiBNb2JpbGl0eTogQ29tbXV0aW5nIFpvbmUgSW50ZXJnZW5lcmF0aW9uYWwgTW9iaWxpdHkgRXN0aW1hdGVzIGJ5IEJpcnRoIENvaG9ydCkNCmh0dHBzOi8vb3Bwb3J0dW5pdHlpbnNpZ2h0cy5vcmcvZGF0YS8/Z2VvZ3JhcGhpY19sZXZlbD0xMDEmdG9waWM9MCZwYXBlcl9pZD0wI3Jlc291cmNlLWxpc3RpbmcNCmBgYHtyIG1vYmlsaXR5IGRhdGEsIGluY2x1ZGU9RkFMU0V9DQojIG1vYmlsaXR5LmRhdGEgPC0gcmVhZF94bHMoJ29ubGluZWRhdGExX3RyZW5kcy54bHMnKQ0KIyBjb2xuYW1lcyhtb2JpbGl0eS5kYXRhKSA8LSBtb2JpbGl0eS5kYXRhWzE1LCBdDQojIG1vYmlsaXR5IDwtIG1vYmlsaXR5LmRhdGFbLWMoMToxNiksIF0NCiMgbW9iaWxpdHkuMTk4NiA8LSBtb2JpbGl0eSAlPiUNCiMgICBmaWx0ZXIoYEJpcnRoIENvaG9ydGAgPT0gMTk4NikNCiMgbW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgIDwtIGFzLm51bWVyaWMobW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgKQ0KIyBjei5tb2JpbGl0eS5kYXRhIDwtIGZ1bGxfam9pbihtb2JpbGl0eS4xOTg2WywgYygxLCAzOjgpXSwNCiMgICAgICAgICAgICAgICAgICAgY3osDQojICAgICAgICAgICAgICAgICAgIGJ5ID0gYyhgQ29tbXV0aW5nIFpvbmVgID0gJ2N6JykpDQojIA0KIyBjei5tb2JpbGl0eSA8LSBjei5tb2JpbGl0eS5kYXRhWywgYygxOjgsIDIxMzI6MjEzNyldDQojIGN6Lm1vYmlsaXR5IDwtIGN6Lm1vYmlsaXR5WywgYygxLCA4LCA5OjE0LCAzOjcsIDIpXQ0KIyB3cml0ZV9jc3YoY3oubW9iaWxpdHksICdjei5tb2JpbGl0eS5jc3YnKQ0KY3oubW9iaWxpdHkgPC0gcmVhZF9jc3YoJ2N6Lm1vYmlsaXR5LmNzdicpDQpgYGANCg0KUmVhZCBpbiBnZW9qc29uIGZpbGU6DQpgYGB7ciBnZW9qc29ufQ0KY3ouZ2VvanNvbiA8LSBnZW9qc29uX3JlYWQoImN6MTk5MC5qc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPSAic3AiKQ0KIyBWaWV3KGN6Lmdlb2pzb25AZGF0YSkNCiMgY3ouZ2VvanNvbiAlPiUNCiMgICBsZWFmbGV0KCkgJT4lDQojICAgI2FkZFRpbGVzKCkgJT4lDQojICAgYWRkUG9seWdvbnMoKSAlPiUNCiMgICBzZXRWaWV3KC05NiwgMzcuOCwgMykNCmBgYA0KDQpDb21tdXRpbmcgem9uZXMgb24gdGhlIG1hcCAoY3ouZ2VvanNvbkBkYXRhKSBhcmUgaW4gMTk5MHMgZm9ybWF0LiBUaGV5IG5lZWQgdG8gYmUgY29udmVydGVkIHNvIG91ciBwb3N0LTIwMDAgZGF0YSBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaGFwZWZpbGVzOg0KKGh0dHBzOi8vd3d3LmVycy51c2RhLmdvdi9kYXRhLXByb2R1Y3RzL2NvbW11dGluZy16b25lcy1hbmQtbGFib3ItbWFya2V0LWFyZWFzLykNCmBgYHtyIGN6IHNoYXBlIGNvbWJpbmUsIGluY2x1ZGUgPSBGQUxTRX0NCiMgY3ouY29udmVyc2lvbnMgPC0gcmVhZF94bHMoJ2N6MDBfZXF2X3YxLnhscycpDQojIGN6LmNvbnZlcnNpb25zIDwtIGN6LmNvbnZlcnNpb25zWywgYygyOjQpXQ0KIyBjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5OTBgIDwtIGFzLm51bWVyaWMoY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTkwYCkNCiMgY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTgwYCA8LSBhcy5udW1lcmljKGN6LmNvbnZlcnNpb25zJGBDb21tdXRpbmcgWm9uZSBJRCwgMTk4MGApDQojIGNvbG5hbWVzKGN6LmNvbnZlcnNpb25zKVsyXSA8LSAnY3oxOTkwJw0KIyBjb2xuYW1lcyhjei5jb252ZXJzaW9ucylbMV0gPC0gJ2N6MjAwMCcNCiMgY29sbmFtZXMoY3ouY29udmVyc2lvbnMpWzNdIDwtICdjejE5ODAnDQojIA0KIyBoZWFkKGN6Lmdlb2pzb25AZGF0YSkNCiMgY3ouZ2VvIDwtIGN6Lmdlb2pzb24NCiMgY29sbmFtZXMoY3oubW9iaWxpdHkpWzFdIDwtICdjejE5OTAnDQojIA0KIyBjei5nZW9AZGF0YSA8LSBmdWxsX2pvaW4oY3ouZ2VvQGRhdGEsDQojICAgICAgICAgICAgICAgICAgIGN6LmNvbnZlcnNpb25zWywgLTNdLA0KIyAgICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCiMgY3ouZ2VvQGRhdGEgPC0gbGVmdF9qb2luKGN6Lmdlb0BkYXRhLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY3oubW9iaWxpdHksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCiMgDQojIGN6LmdlbyAlPiUNCiMgICBsZWFmbGV0KCkgJT4lDQojICAgYWRkUG9seWdvbnMoKSAlPiUNCiMgICBzZXRWaWV3KC05NiwgMzcuOCwgMykNCg0KIyBnZW9qc29uX3dyaXRlKGN6LmdlbywNCiMgICAgICAgICAgICAgICBmaWxlID0gImN6X2dlby5nZW9qc29uIiwNCiMgICAgICAgICAgICAgICBvdmVyd3JpdGUgPSBUUlVFKQ0KDQpjei5nZW8gPC0gZ2VvanNvbl9yZWFkKCJjel9nZW8uZ2VvanNvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID0gInNwIikNCmBgYA0KDQpNYWtpbmcgdGhlIG1hcCBhY3R1YWxseSBkaXNwbGF5IGRhdGE6DQpgYGB7cn0NCmJpbnMxIDwtIGMoMSwgNSwgMTAsIDIwLCA0MCwgNjAsIDkwKQ0KICAgICAgICANCmNvbG9yczEgPC0gY29sb3JCaW4oYmlucyA9IGJpbnMxLA0KICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIllsT3JSZCIsDQogICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGN6Lmdlb0BkYXRhJG5jb2xsZWdlKQ0KICAgICAgICANCmN6LmdlbyAlPiUNCiAgbGVhZmxldCgpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+Y29sb3JzMShjei5nZW9AZGF0YSRuY29sbGVnZSksDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNykgJT4lDQogIHNldFZpZXcoLTk2LCAzNy44LCAzKSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IGNvbG9yczEsDQogICAgICAgICAgICB2YWx1ZXMgPSBjei5nZW9AZGF0YSRuY29sbGVnZSwNCiAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBDb2xsZWdlcyBpbiBDb21tdXRpbmcgWm9uZSIpDQoNCg0KYGBgDQoNCg0KVHJ5IHRvIHJ1biBzb21lIGxtczoNCg0KICBJdnkncyBTVEFUQSBjb2RlOg0KDQogICAgZm9yZWFjaCB4IG9mIHZhcmxpc3QgbmNvbGxlZ2UgbmZvdXJ5ciBuZm91cnlycHJpdiBucHViIG5lbGl0ZSBoYXNjb2xsZWdlew0KICAgIAkNCiAgICBmb3JlYWNoIHkgb2YgdmFybGlzdCBrZnJfcG9vbGVkX3Bvb2xlZF9wMSBrZnJfcG9vbGVkX3Bvb2xlZF9wMjUga2ZyX3Bvb2xlZF9wb29sZWRfcDUwIGtmcl9wb29sZWRfcG9vbGVkX3A3NSBrZnJfcG9vbGVkX3Bvb2xlZF9wMTAwIHsNCiAgICAJcmVnIGB5JyBgeCcgcG9wZGVuc2l0eTIwMTAgbWVkX2hoaW5jMjAxNiwgciANCiAgICAJb3V0cmVnMiB1c2luZyBgeCdfa2ZyLCBleGNlbCBhcHBlbmQgY3RpdGxlKGB5JykNCiAgICB9DQogICAgDQogIFZhcmlhYmxlcyBvZiBpbnRlcmVzdDoNCiAgDQpgYGB7cn0NCnl2YXIxIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMSINCnh2YXJzMSA8LSBjKCJuY29sbGVnZSIsICJuZm91cnlyIiwgIm5mb3VyeXJwcml2IiwgIm5wdWIiLCAibmVsaXRlIiwgImhhc2NvbGxlZ2UiLCAicG9wZGVuc2l0eTIwMTAiLCAibWVkX2hoaW5jMjAxNiIpDQpjejEgPC0gY3pbLCBjKHl2YXIxLCB4dmFyczEpXQ0KDQpsbS5tb2RlbDEgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhcjEsICIgfiAiLCBwYXN0ZTAoeHZhcnMxLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KDQpgYGANCg0KdGVzdGluZz8NCmBgYHtyfQ0KbG0ua2ZyX3AxIDwtIGxtKGxtLm1vZGVsMSwNCiAgICAgICAgICAgICAgICBkYXRhID0gY3opDQpzdW1tYXJ5KGxtLmtmcl9wMSkNCg0Kc3RhcmdhemVyKGN6MSwgdHlwZSA9ICJ0ZXh0IiwgdGl0bGU9IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3MiLCBkaWdpdHM9MSwgb3V0PSJ0YWJsZTEudHh0IikNCg0Kc3RhcmdhemVyKGxtLmtmcl9wMSwNCiAgICAgICAgICB0eXBlID0gInRleHQiLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gYygia2ZyX3Bvb2xlZF9wb29sZWRfcDEiKSkNCiAjICAgICAgICAgICwNCiAjICAgICAgICAgIGNvdmFyaWF0ZS5sYWJlbHMgPSBjKCJHcm9zcyBob3JzZXBvd2VyIiwgIlJlYXIgYXhsZSByYXRpbyIsIkZvdXIgZm93YXJkIGdlYXJzIiwNCiAjICJGaXZlIGZvcndhcmQgZ2VhcnMiLCJUeXBlIG9mIHRyYW5zbWlzc2lvbiAobWFudWFsPTEpIiksIG91dD0ibW9kZWxzLnR4dCIpDQoNCg0KYGBgDQoNCm5lbGl0ZSBvbiBrZnIgYXQgZGlmZmVyZW50IGxldmVscw0KYGBge3J9DQp5dmFyLnAxIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMSINCnl2YXIucDI1IDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMjUiDQp5dmFyLnA1MCA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDUwIg0KeXZhci5wNzUgPC0gImtmcl9wb29sZWRfcG9vbGVkX3A3NSINCnl2YXIucDEwMCA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDEwMCINCnh2YXJzLm5lbGl0ZSA8LSBjKCJuZWxpdGUiLCAicG9wZGVuc2l0eTIwMTAiLCAibWVkX2hoaW5jMjAxNiIpDQpsbS5uZWxpdGUucDEgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wMSwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDI1IDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDI1LCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCmxtLm5lbGl0ZS5wNTAgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wNTAsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbG0ubmVsaXRlLnA3NSA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnA3NSwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDEwMCA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnAxMDAsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbmVsaXRlLnAxIDwtIGxtKGxtLm5lbGl0ZS5wMSwgY3opDQpuZWxpdGUucDI1IDwtIGxtKGxtLm5lbGl0ZS5wMjUsIGN6KQ0KbmVsaXRlLnA1MCA8LSBsbShsbS5uZWxpdGUucDUwLCBjeikNCm5lbGl0ZS5wNzUgPC0gbG0obG0ubmVsaXRlLnA3NSwgY3opDQpuZWxpdGUucDEwMCA8LSBsbShsbS5uZWxpdGUucDEwMCwgY3opDQp0eHR0YWJsZS5uZWxpdGUgPC0gc3RhcmdhemVyKG5lbGl0ZS5wMSwgbmVsaXRlLnAyNSwgbmVsaXRlLnA1MCwgbmVsaXRlLnA3NSwgbmVsaXRlLnAxMDAsDQogICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICB0aXRsZSA9ICJUaGUgRWZmZWN0IG9mIEVsaXRlIENvbGxlZ2VzIGluIENvbW11dGluZyBab25lIG9uIHRoZSBQcm9iYWJpbGl0eSB0aGF0IGEgQ2hpbGQgZnJvbSB0aGUgMjB0aCBQZXJjZW50aWxlIEZhbGxzIGluIEVhY2ggSW5jb21lIFBlcmNlbnRpbGUgYXMgYW4gQWR1bHQiLA0KICAgICAgICAgIGRlcC52YXIuY2FwdGlvbiA9ICJQYXJlbnQgSW5jb21lIFBlcmNlbnRpbGUiLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gYygiQm90dG9tIDElIiwgIjI1JSIsICI1MCUiLCAiNzUlIiwgIlRvcCAxJSIpLA0KICAgICAgICAgICMgbm90ZXMgPSAiV2hlcmUgbmVsaXRlIGlzIHRoZSBudW1iZXIgb2YgZWxpdGUgY29sbGVnZXMgaW4gY29tbXV0aW5nIHpvbmUgKGN6KSwgcG9wZGVuc2l0eTIwMTAgaXMgdGhlIGN6J3MgcG9wdWx0aW9uIGRlbnNpdHksIGFuZCBtZWRfaGhpbmMyMDE2IGlzIHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBpbiBjeiBpbiAyMDE2LiIsDQogICAgICAgICAgIyBub3Rlcy5hcHBlbmQgPSBUUlVFLA0KICAgICAgICAgICMgbm90ZXMuYWxpZ24gPSAibCIsDQogICAgICAgICAgb3V0ID0gIm5lbGl0ZXRhYmxlLnR4dCIpDQpodG10YWJsZS5uZWxpdGUgPC0gc3RhcmdhemVyKG5lbGl0ZS5wMSwgbmVsaXRlLnAyNSwgbmVsaXRlLnA1MCwgbmVsaXRlLnA3NSwgbmVsaXRlLnAxMDAsDQogICAgICAgICAgdHlwZSA9ICJodG1sIiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9IGMoIkJvdHRvbSAxJSIsICIyNSUiLCAiNTAlIiwgIjc1JSIsICJUb3AgMSUiKSwNCiAgICAgICAgICBvdXQgPSAibmVsaXRldGFibGUuaHRtbCIpDQpzdW1tYXJ5KGxtLm5lbGl0ZS5wMSkNCmBgYA0KaW1hZ2UgcHJpbnQgY2hlZWVlY2s6DQpgYGB7cn0NCnRhYmxlcyA8LSBkYXRhLmZyYW1lKHRhYmxlbmFtZSA9IGMoImhhc2NvbGxlZ2VfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzY29sbGVnZV9rZnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzY29sbGVnZV90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNjb2xsZWdlX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuY29sbGVnZV90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuY29sbGVnZV93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVsaXRlX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfdG9wMjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVsaXRlX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cl9rZnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cl90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlyX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlycHJpdl90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlycHJpdl93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucHViX2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5wdWJfa2ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5wdWJfdG9wMjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnB1Yl93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW1zdGF0cyIpLA0KICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSA9IGMoIkM6XFxcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcaGFzY29sbGVnZV90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcaGFzY29sbGVnZV93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2VfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5jb2xsZWdlX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2VfdG9wMjAucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5jb2xsZWdlX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZWxpdGVfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5lbGl0ZV9rZnIucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5lbGl0ZV90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmVsaXRlX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cl90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cl93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJwcml2X2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfdG9wMjAucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJwcml2X3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbnB1Yl90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbnB1Yl93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcc3Vtc3RhdHMucG5nIikpDQp0YWJsZXMkdGFibGVuYW1lIDwtIGFzLmNoYXJhY3Rlcih0YWJsZXMkdGFibGVuYW1lKQ0KdGFibGVzJHBpY3R1cmUgPC0gYXMuY2hhcmFjdGVyKHRhYmxlcyRwaWN0dXJlKQ0KDQojIHdyaXRlX2Nzdih0YWJsZXMsICJvdXRwdXR0YWJsZXMuY3N2IikNCg0KIyB0YWJsZXMgJT4lDQojICAgZ2dwbG90KCkgKw0KIyAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQojICAgZ2VvbV9pbWFnZShhZXMoaW1hZ2UgPSBwaWN0dXJlKSwNCiMgICAgICAgICAgICAgIHNpemUgPSAuMikNCmBgYA0KDQoNClBsb3R0aW5nIHRoZSBsbXM6DQoNCmBgYHtyfQ0KbG0xIDwtIGxtKGtmcl9wb29sZWRfcG9vbGVkX21lYW4gfiBuY29sbGVnZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBjeikNCm5jb2xsZWdlLnNlcSA8LSBzZXEoZnJvbSA9IDAsIHRvID0gODIsIGJ5ID0gNSkNCmtmcl9wb29sZWRfcG9vbGVkX21lYW4uc2VxIDwtIHNlcShmcm9tID0gMC4yNDkwODU3LCB0byA9IDAuNjcyODA5MCwgYnkgPSAuMDI1KQ0KcG9wZGVuc2l0eTIwMTAuc2VxIDwtIHNlcShmcm9tID0gMC4xMDYsIHRvID0gNTYzNS44MDQsIGJ5ID0gMzAwKQ0KbWVkX2hoaW5jMjAxNi5zZXEgPC0gc2VxKGZyb20gPSAyNjY0NSwgdG8gPSAxMDMwNDMsIGJ5ID0gMzc1MCkNCmdyaWQxIDwtIGV4cGFuZC5ncmlkKCduY29sbGVnZScgPSBuY29sbGVnZS5zZXEsDQogICAgICAgICAgICAgICAgICAgICAna2ZyX3Bvb2xlZF9wb29sZWRfbWVhbicgPSBrZnJfcG9vbGVkX3Bvb2xlZF9tZWFuLnNlcSwNCiAgICAgICAgICAgICAgICAgICAgICdwb3BkZW5zaXR5MjAxMCcgID0gcG9wZGVuc2l0eTIwMTAuc2VxLA0KICAgICAgICAgICAgICAgICAgICAgJ21lZF9oaGluYzIwMTYnID0gbWVkX2hoaW5jMjAxNi5zZXEpDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0LmxtKGxtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZDEpDQpmaW5hbC5kYXRhIDwtIGRhdGEuZnJhbWUoZ3JpZDEsIHByZWRpY3Rpb25zKQ0KDQpmaW5hbC5kYXRhICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBuY29sbGVnZSwNCiAgICAgICAgICAgICB5ID0gcHJlZGljdGlvbnMpKSArDQogIGdlb21fbGluZSgpICsNCiAgc3RhdF9zbW9vdGgoYWVzKHggPSBuY29sbGVnZSwgeSA9IHByZWRpY3Rpb25zKSwgbWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgZm9ybXVsYSA9IHkgfiBrZnJfcG9vbGVkX3Bvb2xlZF9tZWFuIH4gbmNvbGxlZ2UgKyBwb3BkZW5zaXR5MjAxMCArIG1lZF9oaGluYzIwMTYsIHNlID0gRkFMU0UpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJZbE9yUmQiKQ0KDQpnZ3Bsb3QoYWVzKHggPSBwbG90eCwgeSA9IHBsb3R5KSkgJT4lDQogIGdlb21fYWJsaW5lKCkNCg0KbG0yIDwtIGxtKGtmcl9ibGFja19wb29sZWRfcDUwIH4gbmNvbGxlZ2UgKyBwb3BkZW5zaXR5MjAxMCArIG1lZF9oaGluYzIwMTYsDQogICBkYXRhID0gY3opDQpsbTMgPC0gbG0oa2ZyX3doaXRlX3Bvb2xlZF9wNTAgfiBuY29sbGVnZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBjeikNCg0KY3ogJT4lDQogIGdncGxvdChhZXMoeCA9IG5jb2xsZWdlLCB5ID0ga2ZyX3Bvb2xlZF9wb29sZWRfbWVhbikpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMy43OTllLTAxLCBzbG9wZSA9IC04LjU3MmUtMDQpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMy41MjNlLTAxLCBzbG9wZSA9IC05LjU3M2UtMDQpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gNC45NzNlLTAxLCBzbG9wZSA9IC05LjEzM2UtMDQpICsNCiAgeWxpbSgzLjVlLTAxLCAwLjUpDQoNCnBsb3QobG0xKQ0KDQpgYGANCg0KDQoNCldhaXQgbGVtbWUgdHJ5IHRoZSBsb25nIGZvcm1hdCB0aGluZzoNCg0KYGBge3J9DQprZnIuY29scyA8LSBjKCJrZnJfYmxhY2tfcG9vbGVkX3AxIiwgImtmcl9ibGFja19wb29sZWRfcDI1IiwgImtmcl9ibGFja19wb29sZWRfcDUwIiwgImtmcl9ibGFja19wb29sZWRfcDc1IiwgImtmcl9ibGFja19wb29sZWRfcDEwMCIsICJrZnJfcG9vbGVkX3Bvb2xlZF9wMSIsICJrZnJfcG9vbGVkX3Bvb2xlZF9wMjUiLCAia2ZyX3Bvb2xlZF9wb29sZWRfcDUwIiwgImtmcl9wb29sZWRfcG9vbGVkX3A3NSIsICJrZnJfcG9vbGVkX3Bvb2xlZF9wMTAwIiwgImtmcl93aGl0ZV9wb29sZWRfcDEiLCAia2ZyX3doaXRlX3Bvb2xlZF9wMjUiLCAia2ZyX3doaXRlX3Bvb2xlZF9wNTAiLCAia2ZyX3doaXRlX3Bvb2xlZF9wNzUiLCAia2ZyX3doaXRlX3Bvb2xlZF9wMTAwIikNCg0Ka2ZyLnRlc3QgPC0gY3pbLCBjKGtmci5jb2xzLCAibmNvbGxlZ2UiLCAibmZvdXJ5ciIsICJuZWxpdGUiLCAibnB1YiIsICJwb3BkZW5zaXR5MjAxMCIsICJtZWRfaGhpbmMyMDE2IildDQoNCmtleWNvbDEgPC0gImNhdGVnb3J5Ig0KdmFsdWVjb2wxIDwtICJrZnIiDQpnYXRoZXJjb2xzMSA8LSBrZnIuY29scw0KDQpkYXRhX2xvbmcgPC0gZ2F0aGVyXyhrZnIudGVzdCwga2V5Y29sMSwgdmFsdWVjb2wxLCBnYXRoZXJjb2xzMSkNCg0KZGF0YV9sb25nYSA8LSBkYXRhX2xvbmcgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGRhdGFfbG9uZyRjYXRlZ29yeSwgImJsYWNrIiwgbmVnYXRlID0gRkFMU0UpKSAlPiUNCiAgbXV0YXRlKHJhY2UgPSAiYmxhY2siKQ0KDQpkYXRhX2xvbmdhJGNhdGVnb3J5IDwtIGRhdGFfbG9uZ2EkY2F0ZWdvcnkgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX2JsYWNrX3Bvb2xlZF9wMSIsICIxIikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX2JsYWNrX3Bvb2xlZF9wMjUiLCAiMjUiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfYmxhY2tfcG9vbGVkX3A1MCIsICI1MCIpICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl9ibGFja19wb29sZWRfcDc1IiwgIjc1IikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX2JsYWNrX3Bvb2xlZF9wMTAwIiwgIjEwMCIpDQoNCmRhdGFfbG9uZ2IgPC0gZGF0YV9sb25nICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChkYXRhX2xvbmckY2F0ZWdvcnksICJ3aGl0ZSIsIG5lZ2F0ZSA9IEZBTFNFKSkgJT4lDQogIG11dGF0ZShyYWNlID0gIndoaXRlIikNCg0KZGF0YV9sb25nYiRjYXRlZ29yeSA8LSBkYXRhX2xvbmdiJGNhdGVnb3J5ICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl93aGl0ZV9wb29sZWRfcDEiLCAiMSIpICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl93aGl0ZV9wb29sZWRfcDI1IiwgIjI1IikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3doaXRlX3Bvb2xlZF9wNTAiLCAiNTAiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfd2hpdGVfcG9vbGVkX3A3NSIsICI3NSIpICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl93aGl0ZV9wb29sZWRfcDEwMCIsICIxMDAiKQ0KDQpkYXRhX2xvbmdjIDwtIGRhdGFfbG9uZyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoZGF0YV9sb25nJGNhdGVnb3J5LCAicG9vbGVkX3Bvb2xlZCIsIG5lZ2F0ZSA9IEZBTFNFKSkgJT4lDQogIG11dGF0ZShyYWNlID0gInBvb2xlZCIpDQoNCmRhdGFfbG9uZ2MkY2F0ZWdvcnkgPC0gZGF0YV9sb25nYyRjYXRlZ29yeSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfcG9vbGVkX3Bvb2xlZF9wMSIsICIxIikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3Bvb2xlZF9wb29sZWRfcDI1IiwgIjI1IikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3Bvb2xlZF9wb29sZWRfcDUwIiwgIjUwIikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3Bvb2xlZF9wb29sZWRfcDc1IiwgIjc1IikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3Bvb2xlZF9wb29sZWRfcDEwMCIsICIxMDAiKQ0KDQpsb25nLmRhdGExIDwtIHJiaW5kKGRhdGFfbG9uZ2EsIGRhdGFfbG9uZ2IsDQogICAgICAgICAgICAgICAgICAgIGRhdGFfbG9uZ2MpIA0KDQpsb25nLmRhdGExYSA8LSBsb25nLmRhdGExICU+JQ0KICBtdXRhdGUoYmxhY2sgPSBpZmVsc2UocmFjZSA9PSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSwNCiAgICAgICAgIHdoaXRlID0gaWZlbHNlKHJhY2UgPT0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkpDQoNCmxvbmcubG0xIDwtIGxtKGtmciB+IG5jb2xsZWdlICsgYmxhY2sgKyB3aGl0ZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBsb25nLmRhdGExYSkNCnN1bW1hcnkobG9uZy5sbTEpDQoNCmBgYA0KDQoNCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K